package lanQiaoBei.搜索与图论.bfs;
import java.io.*;
import java.util.*;
import java.math.*;
import javafx.util.*;
/*
给定一个n*m的二维整数数组，用来表示一个迷宫，数组中只包含0或1，其中0表示可以走的路，1表示不可通过的墙壁。

最初，有一个人位于左上角(1, 1)处，已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问，该人从左上角移动至右下角(n, m)处，至少需要移动多少次。

数据保证(1, 1)处和(n, m)处的数字为0，且一定至少存在一条通路。

输入格式

第一行包含两个整数n和m。

接下来n行，每行包含m个整数（0或1），表示完整的二维数组迷宫。

输出格式

输出一个整数，表示从左上角移动至右下角的最少移动次数。

数据范围

1≤n,m≤100

样例
输入样例：
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 1 0
0 1 1 1 0
0 0 0 1 0
输出样例：
8
* */
public class P1 {
       static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
       final static int N=110;
       static int g[][]=new int[N][N],dis[][]=new int[N][N],n,m;
       static class Pair{
    	      int x,y;
    	      public Pair(int x,int y) {
				// TODO Auto-generated constructor stub
    	    	  this.x=x;
    	    	  this.y=y;
			}
       }
       static void bfs(){
    	      Pair q[]=new Pair[N];
    	      int hh=0,tt=-1,dix[]={-1,1,0,0},diy[]={0,0,-1,1};
    	      q[++tt]=new Pair(0,0);
    	      dis[0][0]=0;
    	      while(hh<=tt){
    	    	   Pair t=q[hh++];
    	    	   for(int i=0;i<4;i++){
    	    		   int x=t.x+dix[i],y=t.y+diy[i];
    	    		   if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==0&&dis[x][y]==-1){
    	    			   dis[x][y]=dis[t.x][t.y]+1;
    	    			   q[++tt]=new Pair(x, y);
    	    		   }
    	    	   }
    	      }
       }
       public static void main(String[] ss) throws IOException {
		      ss=br.readLine().split(" ");
		      n=Integer.parseInt(ss[0]);m=Integer.parseInt(ss[1]);
		      for(int i=0;i<n;i++){
		    	  ss=br.readLine().split(" ");
		    	  for(int j=0;j<m;j++){
		    		 g[i][j]=Integer.parseInt(ss[j]);
		    		 dis[i][j]=-1;
		    	  }
		      }
		      bfs();
		      System.out.print(dis[n-1][m-1]);
	}
}
